/**
 * 自己写的Session模块，可以替代node-redis存储用户的token等
 * todo : 参考node-redis的源码存储策略
 *
 * @author bian
 * @createDate 2016.5.29
 * @modifyDate 2016.9.6 去除hook
 *
 * @comment 应该添加一个新的线程来维护
 */


var isEmptyObject = function (obj) {
    var i;
    for(i in obj){
        return false;
    }
    return true;
};

var Session = {

    /**
     * 初始化
     */
    init : function(){
        this.session = {};
        this.task = this.task || setTimeout(this._delExpireKey.bind(this),5000);  // 每10秒执行一次删除过期的key
    },

    /**
     * 设置session的key
     * @param key
     * @param value
     */
    set : function(key,value){
        var session = this.session;
        if(typeof(key) !== 'string'){
            throw('key must be string');
        }
        session[key] = {
            val : value
        };
    },

    /**
     * 得到session的值
     * @param key
     * @returns {null}
     */
    get : function(key) {
        var session = this.session;
        return session[key] ? session[key].val : null;
    },

    /**
     * 设置会过期的值
     * @param key
     * @param expire
     * @param value
     */
    setx : function(key,expire,value){
        if(typeof(key) !== 'string'){
            throw('can not set a invalid key');
        }
        if(typeof(expire) !== 'number'){
            throw('expire must be number');
        }
        var session = this.session;
        session[key] = {
            val : value,
            del_at : new Date().getTime() + expire
        };
    },

    /**
     * 删除指定键的值
     * @param key
     */
    delKey : function(key){
        this.session[key] && delete this.session[key]; // 如果session存在就删除
    },

    /**
     * 删除过期的session
     * @private
     */
    _delExpireKey : function (){
        Object.keys(this.session).forEach((k) => {
            var now = new Date().getTime();
            var s = this.session[k];
            if(s.del_at && s.del_at < now){
                this.delKey(k);
            }
        });
    }
};

Session.init();

module.exports = Session;